<?php
	/**
	  * @package	MyDebuger
	  * @name		MyException
	  * @brief		Clase para realizar excepciones personalizadas
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2009-12-14
	  * @version	0.5.6
  	**/

	final class MyException extends Exception implements MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 5;
		/* numero de revision de la clase */
		private static $revision		= 6;

		/* color para los mensajes */
		private $color = '#c00';

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		private function getFormat($text, $style) {
			/* retornamos la cadena con formato */
			return "|font style='$style;'|$text|/font|";
		}

		/* creamos una nueva funcion para obtener los mensajes */
		public final function getMensaje() {
			/* retornamos el mensaje con un color rojo */
			return $this->getFormat($this->message . (
				/* verificamos si ya tiene el archivo origen */
				strstr($this->message, $this->getFrom()) ?
				/* si lo tiene no agregamos nada */
				'' :
				/* si no lo tiene agregamos los datos del archivo */
				$this->getFrom()
			/* enviamos el formato */
			), "color:{$this->color}");
		}

		public final function getFrom() {
			/* obtenemos los datos de los archivos que producen la exepcion */
			$datos = $this->getTrace();
			/* obtenemos la fuente */
			$fuente = $datos[(count($datos) - 1)];
			/* obtenemos el destino */
			$destino = $datos[0];
			/* obtenemos el nombre de la funcion llamada */
			$functionCalled = (
				/* si no es una clase */
				$fuente['class'] == '' ?
				/* agregamos la palabra 'Function' */
				'Function ' :
				/* sino, si es una clase agregamos el nombre de la misma */
				$fuente['class'] . '::'
			/* agregamos el metodo o funcion que se llamo */
			) . $fuente['function'] . '()';
			/* armamos la cadena con el nombre del fichero, linea de error y la funcion */
			$cadenaFile = $this->getFormat($functionCalled, 'font-style:italic') .(
				/* verificamos si existe un fichero fuente */
				isset($fuente['file']) ?
				/* si existe agregamos el fichero fuente */
				' called from ' . $this->getFormat(basename($fuente['file']), 'font-style:italic') . ':' . $fuente['line'] :
				/* si no existe puede que se alla llamado desde el metodo __destruct de la clase */
				''
			);
			/* retornamos el mensaje de error y la cadena de datos del fichero */
			return " [$cadenaFile]";
		}
	}
?>